本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
MySQL是当今流行的开源关系型数据库管理系统之一,被广泛应用于各种互联网、企业和个人项目中。然而,随着数据量的增加以及应用复杂性的提升,数据库的性能可能会成为系统整体性能的瓶颈。单纯的优化SQL语句或者通过分库分表等方式并不能在真正意义上帮您优化MySQL的系统性能,如果您对优化MySQL性能有需求或兴趣,建议您跟随本实验场景通过16K原子写及部分参数优化来提升MySQL性能。
背景信息
MySQL参数
MySQL拥有数百个参数,这些参数覆盖了内存管理、缓存大小、连接处理、日志记录、复制配置、查询优化等方面,具体参数的数量取决于MySQL的版本和安装的存储引擎。正确配置参数可以有效帮助您提升MySQL的性能,但参数配置不正确也会影响MySQL的性能,严重情况下甚至会影响数据的准确性。
下面将从MySQL参数的角度为您提供优化MySQL性能的建议,您可以通过实验室提供的环境去配置这些参数,也可以自行购买实例后按照本文教程配置这些参数。
16K原子写MySQL
在数据库领域,提升数据库性能的方法很多,但其中效果比较显著的就包括16K原子写的MySQL,它的效果在于可以相对显著地提升MySQL服务的读写性能,并且还有降低写放大等优势。而要实现16K原子写的特性,不仅需要数据库软件本身的支持,还需要硬件和文件系统层面的支持。
通常情况下,MySQL数据库是通过MySQL DoubleWrite机制来确保数据一致性和可靠性,该机制可能导致IO负载和延迟的增加,进而降低MySQL的性能,尤其在高负载的数据库中更为明显。本实验利用ESSD云盘具备的16K原子写能力,通过关闭DoubleWrite参数来实现16K原子写能力,既可以确保数据一致性和可靠性,又能减少写入操作的次数和延迟,改善MySQL DoubleWrite机制带来的性能问题,提供更高性能的MySQL数据存储和访问服务。
计费说明
在部署MySQL服务过程中,会根据使用的阿里云资源(ECS实例、ESSD云盘等)的计费方式进行计费。如果您是通过实验室一键部署,创建的实验任务本身不会收费。
实验室一键部署过程中使用到的阿里云资源仅支持按量付费。
部署MySQL服务
手动部署(用于生产环境)
实验室部署的一键搭建能力通常用于快速验证和测试新特性,但不适合直接应用到生产环境中。在生产环境中,建议使用手动部署方式,以确保系统的安全和稳定。
手动部署MySQL服务需先购买ECS实例和ESSD云盘,然后在ECS实例中通过命令部署MySQL服务。
操作步骤
创建ECS实例。ECS实例需要满足以下条件:
以实例规格ecs.c6.2xlarge为例。
仅支持使用CentOS 7镜像,不支持其他类型的镜像。
挂载ESSD类型的数据盘,以500 GiB的ESSD PL1为例。
ECS实例未安装MySQL服务。
具体操作,请参见自定义购买实例。
远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
安装MySQL。
执行以下命令,下载MySQL安装包,以MySQL 8.0为例。
cd /tmp/ wget http://mirrors.cloud.aliyuncs.com/mysql/MySQL-8.0/mysql-8.0.27-1.el7.x86_64.rpm-bundle.tar
执行以下命令,解压缩安装包。
tar -xf mysql-8.0.27-1.el7.x86_64.rpm-bundle.tar
执行以下命令,安装MySQL。
sudo yum install -y mysql-community-{server,client,common,libs,devel}-*
执行以下命令,停止MySQL进程。
sudo systemctl stop mysqld
初始化云盘。
执行以下命令,获取数据盘盘符。
sudo fdisk -l
如下图所示,表示该数据盘未执行过初始化(没有分区),且盘符为
vdb
。执行以下命令,配置全局环境变量。
DEV_LABEL=vdb
其中
vdb
为数据盘盘符,请您根据实际环境替换。执行以下命令,设置MySQL数据保存位置。
MYSQL_HOME=/home/ecs-user/${DEV_LABEL}
执行以下命令,防止virtio引起分块。
sudo sh -c 'echo 256 >/sys/block/vdb/queue/max_sectors_kb'
执行以下命令,创建MySQL目录。
if [ ! -d ${MYSQL_HOME} ]; then sudo mkdir -p ${MYSQL_HOME} fi
(条件必选)执行以下命令,卸载数据盘。
如果您的数据盘尚未初始化,无需执行该步骤。
sudo umount /dev/${DEV_LABEL}
执行以下命令,格式化文件系统,启用
bigalloc
选项,并设置文件系统的块大小为16 KB。echo y | sudo mkfs.ext4 -O bigalloc -C 16k /dev/${DEV_LABEL}
执行以下命令,挂载数据盘。
sudo mount /dev/${DEV_LABEL} ${MYSQL_HOME}
执行以下命令,创建MySQL的日志目录、数据目录等。
sudo mkdir -p ${MYSQL_HOME}/data/dbs sudo mkdir -p ${MYSQL_HOME}/data/mysql sudo mkdir -p ${MYSQL_HOME}/log/mysql sudo mkdir -p ${MYSQL_HOME}/log/redo
配置MySQL。
执行以下命令,创建MySQL配置文件、设置MySQL参数并关闭DoubleWrite。
sudo tee /etc/my.cnf <<EOF [mysqld] port = 3306 back_log = 3000 datadir = ${MYSQL_HOME}/data/dbs log-bin = ${MYSQL_HOME}/log/mysql/mysql-bin.log log-error = ${MYSQL_HOME}/log/mysql/master-error.log innodb_data_home_dir = ${MYSQL_HOME}/data/mysql/ innodb_log_group_home_dir = ${MYSQL_HOME}/log/redo/ innodb_doublewrite_dir = ${MYSQL_HOME}/doublewrite character_set_server = utf8 sync_binlog = 1000 innodb_flush_log_at_trx_commit = 2 innodb_doublewrite = 0 max_connections=151 max_allowed_packet=64M innodb_buffer_pool_size=128M innodb_buffer_pool_instances=1 innodb_read_io_threads=4 innodb_write_io_threads=4 innodb_buffer_pool_instances=1 innodb_flush_log_at_trx_commit=1 innodb_flush_method=O_DIRECT default_authentication_plugin = mysql_native_password EOF
MySQL参数的详细说明,请参见MySQL参数。
执行以下命令,初始化MySQL。
sudo mysqld --defaults-file=/etc/my.cnf --initialize
启动MySQL。
执行以下命令,启动MySQL。
sudo mysqld --user=root --daemonize
执行以下命令,检查MySQL是否正常启动。
ps -aux | grep mysqld
如下图所示,表示MySQL已正常启动。
(可选)配置MySQL开机自启动。
执行以下命令,进入到目标目录。如果不存在,则通过
mkdir
新建。cd /etc/rc.d/init.d
执行以下命令,创建自启动脚本。
sudo tee /etc/rc.d/init.d/ebs_mysql_16k_auto_start.sh <<EOF #!/bin/bash # chkconfig: 345 20 80 # description: EBS MySQL 16K Auto Start Script start() { DEV_LABEL=vdb MYSQL_HOME=/home/ecs-user/\${DEV_LABEL} echo 256 >/sys/block/vdb/queue/max_sectors_kb umount /dev/\${DEV_LABEL} mount /dev/\${DEV_LABEL} \${MYSQL_HOME} mysqld --user=root --daemonize } stop() { killall mysqld echo "Stopping mysqld..." } restart() { stop sleep 2 start } case "\$1" in start) start ;; stop) stop ;; restart) restart ;; *) echo "Usage: \$0 {start|stop|restart}" exit 1 esac exit 0 EOF
执行以下命令,为脚本添加可执行权限。
sudo chmod +x /etc/rc.d/init.d/ebs_mysql_16k_auto_start.sh
执行以下命令,添加脚本开启自启动任务。
sudo chkconfig --add ebs_mysql_16k_auto_start.sh
执行以下命令,配置脚本开启自启动。
sudo chkconfig ebs_mysql_16k_auto_start.sh on
通过实验室一键部署(用于快速验证和测试新特性)
您也可以通过块存储EBS的实验室一键式部署MySQL服务,无需手动购买资源和搭建环境。该实验室场景基于资源编排服务的自动编排及部署能力,结合ESSD云盘的16K原子写能力和MySQL的业务场景,为您提供更加简单易上手的MySQL应用实践,您可以快速获得性能更优的自建数据库服务。
前往实验场景页面。
登录块存储EBS控制台。
说明首次登录EBS控制台时,请根据页面提示创建一个EBS服务关联角色。更多信息,请参见块存储EBS服务关联角色。
在左侧导航栏选择实验室 > 实验场景。
在顶部菜单栏左上角处,选择地域。
在基于EBS部署高性能的MySQL服务实验场景模板中,单击一键创建实验任务。
在实验场景向导页面,设置实验场景的基础信息,然后单击下一步。
参数
说明
实验场景
实验室的应用场景,默认为基于EBS部署高性能的MySQL服务。
实验任务名称
已默认填写,您可以根据需要修改。
性能需求范围
按实际需求选择MySQL数据库的性能指标QPS和TPS范围,本实验任务会根据对应的性能范围为您推荐最佳的实例和云盘配置。
QPS(Query per Second):每秒查询率。是指系统每秒能够响应的查询次数,单位是次/秒。
TPS(Transaction per Second):每秒事务数。是指系统每秒处理的事务数,单位是笔/秒。
实验项
选择基于EBS部署高性能的MySQL和对比环境或基于EBS部署高性能的MySQL。
基于EBS部署高性能的MySQL和对比环境:该实验项会同时为您创建高性能的MySQL和普通的MySQL环境,并且实例和云盘的规格一致,便于您对比性能。
基于EBS部署高性能的MySQL:该实验项会为您创建高性能的MySQL环境。
描述
(非必填)设置实验任务的描述信息。
系统会根据您选择的性能需求范围默认推荐ECS实例、数据盘、弹性公网、MySQL等最佳配置参数,您无需填写,也可以根据需要重新自定义配置。
(可选)在配置参数向导页面,您可以单击编辑修改实验任务的参数。
参数
说明
【高性能】ECS实例
生产可用区:选择实例对应的可用区。
系统镜像:仅支持选择CentOS 7.9。
系统盘:选择您期望的系统盘类型和云盘容量。
CPU(Core):选择该可用区下可用的CPU规格。
内存 (GiB):选择该可用区下可用的内存规格。
实例密码:设置ECS实例的初始登录密码。
重要请您牢记设置的实例密码,以便后续远程连接ECS实例。
实例规格:选择实例规格,不同的实例规格在性能和费用上均有不同。更多信息,请参见实例规格族。本实验以ecs.c6.2xlarge为例。
说明如果实验项选择基于EBS部署高性能的MySQL和对比环境,配置完[高性能]ECS实例后,[普通]ECS实例参数默认和[高性能]ECS实例完全一致。
【高性能】数据盘
数据盘仅支持ESSD云盘,您可以选择期望的ESSD云盘及其对应的容量。本实验以500 GiB的ESSD PL1为例。
说明如果实验项选择基于EBS部署高性能的MySQL和对比环境,配置完[高性能]数据盘后,[普通]数据盘参数默认和[高性能]数据盘完全一致。
带宽
带宽计费模式:默认按使用流量计费。
带宽峰值:设置允许的带宽峰值。带宽峰值是衡量网络性能和网络连接质量的重要指标之一,它可以影响网络数据传输的速度和稳定性。
MySQL
(可选)修改对应的配置后,确认总费用后,单击保存。
检查确认配置参数以及费用信息,然后单击确认。
支付完成后,系统会为您准备资源,并帮助您搭建好对应的实验场景,预计需要5分钟,请您耐心等待。
说明实验任务依赖于ROS资源编排能力,一个实验任务对应于一个资源栈,您最多允许创建200个实验任务。
验证与清理
验证方案
验证MySQL服务可用性
远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
(条件必选)执行以下命令,查看MySQL的临时密码。
如果您是通过实验室一键部署,无需执行本操作查看密码,使用创建实验任务时设置的数据库根账号密码登录MySQL即可。
sudo cat ${MYSQL_HOME}/log/mysql/master-error.log | grep root | grep "temporary password" | awk '{print $13}'
执行以下命令,登录MySQL。
mysql -uroot -p
输入上一步获取的密码,即可登录MySQL。
执行以下命令,退出MySQL。
exit
(条件必选)如果您配置了开机重启,执行以下命令重启ECS后,MySQL服务将自动启动。
sudo reboot
执行以下命令,验证MySQL服务是否正常重启。
ps aux | grep mysqld
测试MySQL性能
如果您需要测试MySQL服务的性能,可以参考如下步骤:
远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
执行以下命令,安装SysBench。
sudo yum install -y sysbench
执行以下命令,创建sbtest数据库。
create database sbtest;
执行以下命令,进行性能测试,包括OLTP读写混合场景压测、OLTP只读场景压测和OLTP只写场景压测。
OLTP读写混合场景
参考如下命令进行测试,参数说明请参考性能测试指导。
##准备数据 sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=100 --events=0 --time=300 --threads=XXX oltp_read_write prepare ##运行workload sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=100 --events=0 --time=300 --threads=XXX --percentile=95 --report-interval=1 oltp_read_write run ##清理数据 sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=100 --events=0 --time=300 --threads=XXX --percentile=95 oltp_read_write cleanup
测试结果示例如下所示:
QPS:12555.24
TPS:627.76
时延:52.89 ms
OLTP只读场景
参考如下命令进行测试,参数说明请参见性能测试指导。
##准备数据 sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=100 --events=0 --time=300 --threads=XXX oltp_read_only prepare ##运行workload sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=100 --events=0 --time=300 --threads=XXX --percentile=95 --skip-trx=1 --report-interval=1 oltp_read_only run ##清理数据 sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=100 --events=0 --time=300 --threads=XXX --percentile=95 oltp_read_only cleanup
测试结果示例如下所示:
QPS:15032.03
TPS:939.50
时延:19.29 ms
OLTP只写场景
参考如下命令进行测试,参数说明请参见性能测试指导。
##准备数据 sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=100 --events=0 --time=300 --threads=XXX oltp_write_only prepare ##运行workload sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=100 --events=0 --time=300 --threads=XXX --percentile=95 --report-interval=1 oltp_write_only run ##清理数据 sysbench --db-driver=mysql --mysql-host=XXX --mysql-port=XXX --mysql-user=XXX --mysql-password=XXX --mysql-db=sbtest --table_size=25000 --tables=100 --events=0 --time=300 --threads=XXX --percentile=95 oltp_write_only cleanup
测试结果示例如下:
QPS:4255.01
TPS:2038.18
时延:20.74 ms
性能结果对比
您可以通过以下步骤验证本文提供的部署方案与普通部署方案对MySQL性能的提升效果。
对比规格
建议普通部署与本文部署使用完全一致的实例规格、云盘规格、MySQL安装方法和参数配置。普通部署也以实例规格是ecs.c6.2xlarge、数据盘是500 GiB的ESSD PL1、镜像是CentOS 7、MySQL是8.0为例。
部署MySQL步骤
测试结果对比
重要测试结果受不同实例、云盘以及环境等众多因素的影响,本示例数据仅供参考。
本文部署MySQL性能测试结果
普通部署MySQL性能测试结果
通过本文部署MySQL的QPS为42153,而普通部署MySQL的QPS为27449,性能提升超过50%,在TPS、时延等方面也会有一些性能提升。
清理资源
如果您是通过实验室一键部署,测试完成后建议您及时清理相关资源,避免继续产生费用。
推荐您通过实验室一键删除实验任务的相关资源,不建议通过ECS控制台或者EBS控制台释放实例和云盘,避免误操作导致实验任务资源不可用。
登录块存储EBS控制台。
在左侧导航栏选择实验室 > 任务列表。
在顶部菜单栏左上角处,选择地域。
在目标实验任务的操作列,单击删除。
您也可以选中多个实验任务,在列表底部单击批量删除。
删除实验任务时默认不会释放实验资源,如果选中是否删除资源,实验任务中的资源,例如ECS实例、数据库实例等均会被释放,请您谨慎操作。